/**
 * 
 */
package com.question.variable;

/**
 * 总结：
 *  1. 由于private变量受访问权限的限制，它不能被覆盖。
    2. 属性的值取父类还是子类并不取决于我们创建对象的类型，而是取决于我们定义的变量的类型。
    3. friendly、protected和public修饰符并不影响属性的覆盖。
    4. 静态变量和静态常量属于类，不属于对象，因此它们不能被覆盖。
    5. 常量可以被覆盖。
    6. 对于基本类型和对象，它们适用同样的覆盖规律。
 * 
 * @data 2012-10-30 下午07:58:27
 * @author nassir wen
 */
public class SubClass extends ParentClass {
    private String privateField = "子类变量--private";
    /* friendly */String friendlyField = "子类变量--friendly";
    protected String protectedField = "子类变量--protected";
    public String publicField = "子类变量--public";

    // private的变量无法直接访问，因此我们给他增加了一个访问方法
    public String getPrivateFieldValue() {
        return privateField;
    }

    public static void main(String[] args) {
        // 为了便于查阅，我们统一按照private、friendly、protected、public的顺序
        // 输出下列三种情况中变量的值
        // ParentClass类型，ParentClass对象
        ParentClass parentClass = new ParentClass();
        System.out.println("ParentClass parentClass = new ParentClass();");
        System.out.println(parentClass.getPrivateFieldValue());
        System.out.println(parentClass.friendlyField);
        System.out.println(parentClass.protectedField);
        System.out.println(parentClass.publicField);
        System.out.println();
        // ParentClass类型，SubClass对象
        ParentClass subClass = new SubClass();
        System.out.println("ParentClass subClass = new SubClass();");
        System.out.println(subClass.getPrivateFieldValue());
        System.out.println(subClass.friendlyField);
        System.out.println(subClass.protectedField);
        System.out.println(subClass.publicField);
        System.out.println();
        // SubClass类型，SubClass对象
        SubClass subClazz = new SubClass();
        System.out.println("SubClass subClazz = new SubClass();");
        System.out.println(subClazz.getPrivateFieldValue());
        System.out.println(subClazz.friendlyField);
        System.out.println(subClazz.protectedField);
        System.out.println(subClazz.publicField);
    }
}

class ParentClass {
    private String privateField = "父类变量--private";
    /* friendly */String friendlyField = "父类变量--friendly";
    protected String protectedField = "父类变量--protected";
    public String publicField = "父类变量--public";

    // private的变量无法直接访问，因此我们给他增加了一个访问方法
    public String getPrivateFieldValue() {
        return privateField;
    }
}
